import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class Test {
    public static void main(String[] args) {
        //
    }
}

class Solution
{
    public int[] findOrder(int n, int[][] prerequisites)
    {
        // 1. 准备⼯作
        int[] in = new int[n]; // 统计每个顶点的⼊度
        List<List<Integer>> edges = new ArrayList<>();
        for(int i = 0; i < n; i++)
        {
            edges.add(new ArrayList<>());
        }
        // 2. 建图
        for(int i = 0; i < prerequisites.length; i++)
        {
        int a = prerequisites[i][0], b = prerequisites[i][1]; // b -> a
        edges.get(b).add(a);
        in[a]++;
    }
        // 3. 拓扑排序
        Queue<Integer> q = new LinkedList<>();
        int[] ret = new int[n];
        int index = 0;
        for(int i = 0; i < n; i++)
        {
            if(in[i] == 0) q.add(i);
        }
        while(!q.isEmpty())
        {
            int t = q.poll();
            ret[index++] = t;
            for(int a : edges.get(t))
            {
                in[a]--;
                if(in[a] == 0) q.add(a);
            }
        }
        if(index == n) return ret;
        return new int[0];
    }
}

